home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Mac / Lib / ic.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2000-06-23  |  12.7 KB  |  314 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 1.5)
  3.  
  4. '''IC wrapper module, based on Internet Config 1.3'''
  5. import icglue
  6. import string
  7. import sys
  8. import Res
  9. import macfs
  10. import macostools
  11. error = icglue.error
  12. icPrefNotFoundErr = -666
  13. icPermErr = -667
  14. icPrefDataErr = -668
  15. icInternalErr = -669
  16. icTruncatedErr = -670
  17. icNoMoreWritersErr = -671
  18. icNothingToOverrideErr = -672
  19. icNoURLErr = -673
  20. icConfigNotFoundErr = -674
  21. icConfigInappropriateErr = -675
  22. ICattr_no_change = -1
  23. icNoPerm = 0
  24. icReadOnlyPerm = 1
  25. icReadWritePerm = 2
  26.  
  27. class ICOpaqueData:
  28.     '''An unparseable IC entry'''
  29.     
  30.     def __init__(self, data):
  31.         self.data = data
  32.  
  33.     
  34.     def __repr__(self):
  35.         return 'ICOpaqueData(%s)' % `self.data`
  36.  
  37.  
  38. _ICOpaqueDataType = type(ICOpaqueData(''))
  39.  
  40. def _decode_default(data, key):
  41.     if len(data) == 0:
  42.         return data
  43.     
  44.     if ord(data[0]) == len(data) - 1:
  45.         return data[1:]
  46.     
  47.     return ICOpaqueData(data)
  48.  
  49.  
  50. def _decode_multistr(data, key):
  51.     numstr = ord(data[0]) << 8 | ord(data[1])
  52.     rv = []
  53.     ptr = 2
  54.     for i in range(numstr):
  55.         strlen = ord(data[ptr])
  56.         str = data[ptr + 1:ptr + strlen + 1]
  57.         rv.append(str)
  58.         ptr = ptr + strlen + 1
  59.     
  60.     return rv
  61.  
  62.  
  63. def _decode_fontrecord(data, key):
  64.     size = ord(data[0]) << 8 | ord(data[1])
  65.     face = ord(data[2])
  66.     namelen = ord(data[4])
  67.     return (size, face, data[5:5 + namelen])
  68.  
  69.  
  70. def _decode_boolean(data, key):
  71.     return ord(data[0])
  72.  
  73.  
  74. def _decode_text(data, key):
  75.     return data
  76.  
  77.  
  78. def _decode_charset(data, key):
  79.     return (data[:256], data[256:])
  80.  
  81.  
  82. def _decode_appspec(data, key):
  83.     namelen = ord(data[4])
  84.     return (data[0:4], data[5:5 + namelen])
  85.  
  86.  
  87. def _code_default(data, key):
  88.     return chr(len(data)) + data
  89.  
  90.  
  91. def _code_multistr(data, key):
  92.     numstr = len(data)
  93.     rv = chr(numstr >> 8 & 255) + chr(numstr & 255)
  94.     for i in data:
  95.         rv = rv + _code_default(i)
  96.     
  97.     return rv
  98.  
  99.  
  100. def _code_fontrecord(data, key):
  101.     (size, face, name) = data
  102.     return chr(size >> 8 & 255) + chr(size & 255) + chr(face & 255) + chr(0) + _code_default(name)
  103.  
  104.  
  105. def _code_boolean(data, key):
  106.     print 'XXXX boolean:', `data`
  107.     return chr(data)
  108.  
  109.  
  110. def _code_text(data, key):
  111.     return data
  112.  
  113.  
  114. def _code_charset(data, key):
  115.     return data[0] + data[1]
  116.  
  117.  
  118. def _code_appspec(data, key):
  119.     return data[0] + _code_default(data[1])
  120.  
  121. _decoder_table = {
  122.     'ArchieAll': (_decode_multistr, _code_multistr),
  123.     'UMichAll': (_decode_multistr, _code_multistr),
  124.     'InfoMacAll': (_decode_multistr, _code_multistr),
  125.     'ListFont': (_decode_fontrecord, _code_fontrecord),
  126.     'ScreenFont': (_decode_fontrecord, _code_fontrecord),
  127.     'PrinterFont': (_decode_fontrecord, _code_fontrecord),
  128.     'Signature': (_decode_text, _code_text),
  129.     'Plan': (_decode_text, _code_text),
  130.     'MailHeaders': (_decode_text, _code_text),
  131.     'NewsHeaders': (_decode_text, _code_text),
  132.     'CharacterSet': (_decode_charset, _code_charset),
  133.     'Helper\xa5': (_decode_appspec, _code_appspec),
  134.     'NewMailFlashIcon': (_decode_boolean, _code_boolean),
  135.     'NewMailDialog': (_decode_boolean, _code_boolean),
  136.     'NewMailPlaySound': (_decode_boolean, _code_boolean),
  137.     'NoProxyDomains': (_decode_multistr, _code_multistr),
  138.     'UseHTTPProxy': (_decode_boolean, _code_boolean),
  139.     'UseGopherProxy': (_decode_boolean, _code_boolean),
  140.     'UseFTPProxy': (_decode_boolean, _code_boolean),
  141.     'UsePassiveFTP': (_decode_boolean, _code_boolean) }
  142.  
  143. def _decode(data, key):
  144.     if '\xa5' in key:
  145.         key2 = key[:string.index(key, '\xa5') + 1]
  146.     else:
  147.         key2 = key
  148.     if _decoder_table.has_key(key2):
  149.         decoder = _decoder_table[key2][0]
  150.     else:
  151.         decoder = _decode_default
  152.     return decoder(data, key)
  153.  
  154.  
  155. def _code(data, key):
  156.     if type(data) == _ICOpaqueDataType:
  157.         return data.data
  158.     
  159.     if '\xa5' in key:
  160.         key2 = key[:string.index(key, '\xa5') + 1]
  161.     else:
  162.         key2 = key
  163.     if _decoder_table.has_key(key2):
  164.         coder = _decoder_table[key2][1]
  165.     else:
  166.         coder = _code_default
  167.     return coder(data, key)
  168.  
  169.  
  170. class IC:
  171.     
  172.     def __init__(self, signature = 'Pyth', ic = None):
  173.         if ic:
  174.             self.ic = ic
  175.         else:
  176.             self.ic = icglue.ICStart(signature)
  177.             self.ic.ICFindConfigFile()
  178.         self.h = Res.Resource('')
  179.  
  180.     
  181.     def keys(self):
  182.         rv = []
  183.         self.ic.ICBegin(icReadOnlyPerm)
  184.         num = self.ic.ICCountPref()
  185.         for i in range(num):
  186.             rv.append(self.ic.ICGetIndPref(i + 1))
  187.         
  188.         self.ic.ICEnd()
  189.         return rv
  190.  
  191.     
  192.     def has_key(self, key):
  193.         
  194.         try:
  195.             dummy = self.ic.ICFindPrefHandle(key, self.h)
  196.         except icglue.error:
  197.             return 0
  198.  
  199.         return 1
  200.  
  201.     
  202.     def __getitem__(self, key):
  203.         attr = self.ic.ICFindPrefHandle(key, self.h)
  204.         return _decode(self.h.data, key)
  205.  
  206.     
  207.     def __setitem__(self, key, value):
  208.         value = _code(value, key)
  209.         self.ic.ICSetPref(key, ICattr_no_change, value)
  210.  
  211.     
  212.     def launchurl(self, url, hint = ''):
  213.         self.ic.ICLaunchURL(hint, url, 0, len(url))
  214.  
  215.     
  216.     def parseurl(self, data, start = None, end = None, hint = ''):
  217.         if start == None:
  218.             selStart = 0
  219.             selEnd = len(data)
  220.         else:
  221.             selStart = selEnd = start
  222.         if end != None:
  223.             selEnd = end
  224.         
  225.         (selStart, selEnd) = self.ic.ICParseURL(hint, data, selStart, selEnd, self.h)
  226.         return (self.h.data, selStart, selEnd)
  227.  
  228.     
  229.     def mapfile(self, file):
  230.         if type(file) != type(''):
  231.             file = file.as_tuple()[2]
  232.         
  233.         return self.ic.ICMapFilename(file)
  234.  
  235.     
  236.     def maptypecreator(self, type, creator, filename = ''):
  237.         return self.ic.ICMapTypeCreator(type, creator, filename)
  238.  
  239.     
  240.     def settypecreator(self, file):
  241.         if type(file) == type(''):
  242.             fss = macfs.FSSpec(file)
  243.         else:
  244.             fss = file
  245.         name = fss.as_tuple()[2]
  246.         record = self.mapfile(name)
  247.         fss.SetCreatorType(record[2], record[1])
  248.         macostools.touched(fss)
  249.  
  250.  
  251. _dft_ic = None
  252.  
  253. def launchurl(url, hint = ''):
  254.     global _dft_ic
  255.     if _dft_ic == None:
  256.         _dft_ic = IC()
  257.     
  258.     return _dft_ic.launchurl(url, hint)
  259.  
  260.  
  261. def parseurl(data, start = None, end = None, hint = ''):
  262.     global _dft_ic
  263.     if _dft_ic == None:
  264.         _dft_ic = IC()
  265.     
  266.     return _dft_ic.parseurl(data, start, end, hint)
  267.  
  268.  
  269. def mapfile(filename):
  270.     global _dft_ic
  271.     if _dft_ic == None:
  272.         _dft_ic = IC()
  273.     
  274.     return _dft_ic.mapfile(filename)
  275.  
  276.  
  277. def maptypecreator(type, creator, filename = ''):
  278.     global _dft_ic
  279.     if _dft_ic == None:
  280.         _dft_ic = IC()
  281.     
  282.     return _dft_ic.maptypecreator(type, creator, filename)
  283.  
  284.  
  285. def settypecreator(file):
  286.     global _dft_ic
  287.     if _dft_ic == None:
  288.         _dft_ic = IC()
  289.     
  290.     return _dft_ic.settypecreator(file)
  291.  
  292.  
  293. def _test():
  294.     ic = IC()
  295.     for k in ic.keys():
  296.         
  297.         try:
  298.             v = ic[k]
  299.         except error:
  300.             0
  301.             0
  302.             ic.keys()
  303.             v = '????'
  304.         except:
  305.             0
  306.  
  307.         print k, '\t', v
  308.     
  309.     sys.exit(1)
  310.  
  311. if __name__ == '__main__':
  312.     _test()
  313.  
  314.